package list_;

import java.util.ArrayList;

public class ArrayList_Source {
    public static void main(String[] args) {
        /**
         * 1.维护的是一个Object  elementData[]数组
         * 2.有三个构造函数，无参构造
         *   - 会初始化elementData容量为0
         *   - 第一次添加则扩容为10
         *   - 如果再添加扩容为elementData的1.5倍
         * 3.如果使用的是指定大小的构造器
         *   - 初始化elementData容量为指定大小
         *   - 如果需要扩容，则直接按elementData的1.5倍扩容
         *   - 8-》8*1.5=12-》12*1.5=18-》18*1.5=27
         */

        /**
         * 无参构造
         * 1.创建一个空的elementData数组={}
         * 2.执行list.add
         *      (1)先确定是否需要扩容
         *          - 调用ensureCapacityInternal先确定elementData是否是一个空数组   Internal:内部的，本质的
         *          - 如果是那就确定需要扩容的大小，第一次扩容是10（DEFAULT_CAPACITY = 10）
         *          - 最后调用ensureExplicitCapacity 确认是否真的需要扩容  Explicit：确切的，清楚明白的
         *          modCount记录集合被修改的次数 防止多个线程修改minCapacity
         *      (2)如果需要扩容那就调用grow(),否则直接赋值
         *
         * 3.需要扩容执行grow()
         *   grow()真正扩容
         *      采用扩容机制
         *      第一次初始容量为0时 扩容到10
         *      之后每次都是按1.5倍扩容
         *      Array.copyOf()
         */
        //transient 表示短暂的，被transient修饰的属性不会被序列化
        ArrayList arrayList=new ArrayList();
        for(int i=1;i<=10;++i){
            arrayList.add(i);
        }
        arrayList.add(100);

        /**
         * 有参构造
         * 1.创建的不再是一个空，而是一个指定大小的elementData数组={指定大小}
         * 2.其后操作相同
         */
        ArrayList arrayList1=new ArrayList(8);
        for (int i=0;i<=8;++i){
            arrayList1.add(i);
        }
    }
}
